package us.proyecto.canarios.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

import us.proyecto.canarios.domain.Concurso;
import us.proyecto.canarios.domain.Criador;
import us.proyecto.canarios.domain.Pajaro;
import us.proyecto.canarios.domain.Puntuacion;
import us.proyecto.canarios.domain.PuntuacionGrupo;

@Name("pajarosDAO")
@Scope(ScopeType.SESSION)
public class PajarosDAO {

    @In
    EntityManager em;

    public PajarosDAO() {

    }


    public List<Pajaro> getListByWhere(String where){
    	 return em.createQuery("from Pajaro c where "+ where).getResultList();
    }


    public List<Puntuacion> getListPuntuacionByWhere(String where){
   	 return em.createQuery("from Puntuacion p where "+ where).getResultList();
   }

    public Pajaro getPajaroByNumAnilla(String numAnilla){
    	try{
    		return (Pajaro)em.createQuery("from Pajaro where numAnilla = :anilla").setParameter("anilla", numAnilla).getSingleResult();
    	}catch (Exception e) {
			//e.printStackTrace();
		}
    	return null;
    }


    public List<Pajaro> getListPajaroByWhere(String numAnilla){
    	try{
    		return em.createQuery("from Pajaro p where " + numAnilla).getResultList();
    	}catch (Exception e) {
			e.printStackTrace();
		}
    	return null;
    }
    @Begin(join = true, flushMode = FlushModeType.MANUAL)
    public boolean delete(Pajaro usu) {
        boolean correcto;

        try {
        	Pajaro objDel= em.getReference(Pajaro.class, usu.getIdPajaro());
            em.remove(objDel);
            em.flush();
            correcto = true;
        } catch (RuntimeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            correcto = false;
        }
        return correcto;

    }
    @Begin(join = true, flushMode = FlushModeType.MANUAL)
    public boolean save(Pajaro usu) {
        boolean correcto;

        try {
            em.persist(usu);
            em.flush();
            correcto = true;
        } catch (RuntimeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            correcto = false;
        }
        return correcto;

    }

    @Begin(join = true, flushMode = FlushModeType.MANUAL)
    public boolean update(Pajaro usu) {
        boolean correcto;

        try {
        	usu = em.merge(usu);
            em.flush();
            correcto = true;
        } catch (RuntimeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            correcto = false;
        }
        return correcto;

    }

    @Begin(join = true, flushMode = FlushModeType.MANUAL)
    public boolean updateSinFlush(Pajaro usu) {
        boolean correcto;

        try {
        	usu = em.merge(usu);
            correcto = true;
        } catch (RuntimeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            correcto = false;
        }
        return correcto;

    }

    @Begin(join = true, flushMode = FlushModeType.MANUAL)
    public boolean saveSinFlush(Pajaro usu) {
        boolean correcto;

        try {
            em.persist(usu);
            correcto = true;
        } catch (RuntimeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            correcto = false;
        }
        return correcto;

    }

    public void flush(){
    	em.flush();
    }

    public List<Puntuacion> getListaPajarosXConcursoSinEvaluar(Concurso c){
    	List<Puntuacion> listaP= em.createQuery("select p from Puntuacion p where p.puntuacionGrupo is null and p.puntuacion is null and p.descalificado = false and p.concurso.idConcurso = "+c.getIdConcurso()).getResultList();
    	return listaP;
    }
    public List<Puntuacion> getListaPajarosXConcursoEvaluados(Concurso c){
    	List<Puntuacion> listaP= em.createQuery("select p from Puntuacion p where p.puntuacionGrupo is null and (p.puntuacion is not null or p.descalificado = true) and p.concurso.idConcurso = "+c.getIdConcurso()).getResultList();
    	return listaP;
    }

    public List<Puntuacion> getListaPajarosXConcursoTodos(Concurso c){
    	List<Puntuacion> listaP= em.createQuery("select p from Puntuacion p where p.puntuacionGrupo is null and p.concurso.idConcurso = "+c.getIdConcurso()).getResultList();
    	return listaP;
    }

    public List<PuntuacionGrupo> getListaGruposXConcursoSinEvaluar(Concurso c){
    	List<PuntuacionGrupo> listaP= em.createQuery("select p from PuntuacionGrupo p where p.puntuacion is null and p.descalificado = false and p.concurso.idConcurso = "+c.getIdConcurso()).getResultList();
    	return listaP;
    }
    public List<PuntuacionGrupo> getListaGruposXConcursoEvaluados(Concurso c){
    	List<PuntuacionGrupo> listaP= em.createQuery("select p from PuntuacionGrupo p where (p.puntuacion is not null or p.descalificado = true) and p.concurso.idConcurso = "+c.getIdConcurso()).getResultList();
    	return listaP;
    }

    public List<PuntuacionGrupo> getListaGruposXConcursoTodos(Concurso c){
    	List<PuntuacionGrupo> listaP= em.createQuery("select p from PuntuacionGrupo p where p.concurso.idConcurso = "+c.getIdConcurso()).getResultList();
    	return listaP;
    }

    public List<Puntuacion> getListaPajarosXConcurso(Concurso c, Criador cri){
    	List<Puntuacion> listaP= em.createQuery("select p from Puntuacion p where p.puntuacionGrupo is null and p.concurso.idConcurso = "+c.getIdConcurso()+" and p.pajaro.criador.idCriador="+cri.getIdCriador()).getResultList();
    	return listaP;
    }

    public List<Puntuacion> getListaPajarosXConcursoTodos(Concurso c, Criador cri){
    	List<Puntuacion> listaP= em.createQuery("select p from Puntuacion p where p.concurso.idConcurso = "+c.getIdConcurso()+" and p.puntuacionGrupo is null and p.pajaro.criador.idCriador="+cri.getIdCriador()).getResultList();
    	return listaP;
    }



    public List<PuntuacionGrupo> getListaGruposXConcurso(Concurso c, Criador cri){
    	List<Puntuacion> listaP= em.createQuery("select p from Puntuacion p where p.puntuacionGrupo is not null and p.concurso.idConcurso = "+c.getIdConcurso()+" and p.pajaro.criador.idCriador="+cri.getIdCriador()).getResultList();
    	List<PuntuacionGrupo> listaG= new ArrayList<PuntuacionGrupo>();
    	for(Puntuacion p:listaP){
    		if(!listaG.contains(p.getPuntuacionGrupo())){
    			listaG.add(p.getPuntuacionGrupo());
    		}
    	}
    	return listaG;
    }



    public void remover(Object obj){
    	em.remove(obj);
    }

    public Puntuacion getPuntuacionByNumAnillaConcurso(String numAnilla, String idConcurso){
    	try{
    		Puntuacion p = (Puntuacion)em.createQuery("select p from Puntuacion p where p.pajaro.numAnilla = '"+ numAnilla +"' and p.concurso.idConcurso = '"+ idConcurso + "'").getSingleResult();
    		return p;
    	}catch (NoResultException e) {
			return null;
		}
    }
    public PuntuacionGrupo getPuntuacionGrupoByNumGrupoConcurso(String numAnilla, String idConcurso){
    	try{
    		PuntuacionGrupo p = (PuntuacionGrupo)em.createQuery("select p from PuntuacionGrupo p where p.numero = '"+ numAnilla +"' and p.concurso.idConcurso = '"+ idConcurso + "'").getSingleResult();
    		return p;
    	}catch (NoResultException e) {
			return null;
		}
    }

    public List<Puntuacion> getPuntuacionesPajaro(Pajaro p){
    	return em.createQuery("select p from Puntuacion p where p.pajaro.idPajaro = " +p.getIdPajaro()+ " order by p.concurso.fechaInicio").getResultList();

    }


	public Puntuacion getPuntuacionById(String idPuntuacion) {
		return (Puntuacion)em.createQuery("select p from Puntuacion p where p.idPuntuacion = " +idPuntuacion).getSingleResult();
	}


	public List<Pajaro> getPajarosDisponibles(Criador c, Concurso con){
		List<Pajaro> listaEnConcurso = (List<Pajaro>)em.createQuery("select p.pajaro from Puntuacion p where p.concurso.idConcurso= "+ con.getIdConcurso() +" and p.pajaro.criador.idCriador =" + c.getIdCriador()).getResultList();
		List<Pajaro> listaNoConcurso = new ArrayList<Pajaro>(c.getPajaros());
		listaNoConcurso.removeAll(listaEnConcurso);
		return listaNoConcurso;
	}
	
	public Puntuacion sincroniza(Puntuacion p){
		p = em.merge(p);
		return p;
	}
}
